Q:
OpenGL ÉGÉìÉgÉäÉ|ÉCÉìÉgÇ÷ÇÃä÷êîÉ|ÉCÉìÉ^ÇéÊìæÇ∑ÇÈÇ…ÇÕÅAǫǧǵÇΩÇÁÇÊÇ¢ÇÃÇ≈ǵÇÂǧǩÅH
A:
OpenGL ÉGÉìÉgÉäÉ|ÉCÉìÉgÇ÷ÇÃä÷êîÉ|ÉCÉìÉ^ÇÕÅACocoa Ç‹ÇΩÇÕ Carbon ÇÃÇ«ÇøÇÁÇ©ÇÁÇ≈LJíPèÉÇ»éËë±Ç´Ç≈éÊìæÇµÇ‹Ç∑ÅBCocoa Mach-O Ç‹ÇΩÇÕ Carbon Mach-O Ç≈ÇÕÅAä˘ë∂Çà NSLookupAndBindSymbol Çégópǵǃ OpenGL ÉGÉìÉgÉäÉ|ÉCÉìÉgÇÃÉAÉhÉåÉXÇéÊìæÇµÇ‹Ç∑ÅBCarbon CFM Ç≈ÇÕéËë±Ç´Ç™Ç‚Ç‚ï°éGÇ≈ÅAOpenGL Framework ÉoÉìÉhÉãÇíTǵèoǵÅACFBundleGetFunctionPointerForName ä÷êîÇégópǵǃé¿ç€ÇÃä÷êîÇéÊìæÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBCarbon ÇÃéËë±Ç´ÇÕÅAǪÇÃNjNj Mach-O Ç®ÇÊÇ— CFM Çà 2 ǬÇÃÉoÉCÉiÉäå`éÆÇ≈LJã@î\ǵNjÇ∑ÅB
OpenGL ÇÃÉGÉìÉgÉäÉ|ÉCÉìÉgÇÃêîÇÕëùǶë±ÇØÇƒÇ¢Ç‹Ç∑Ç™ÅAëSÉGÉìÉgÉäÉ|ÉCÉìÉgǙdžÇÁljÇÈÉoÅ[ÉWÉáÉìÇà Mac OS X Ç≈ÉGÉNÉXÉ|Å[ÉgÇ≥ÇÍǃǢÇÈÇÌÇØÇ≈ÇÕdžÇËÇ‹ÇπÇÒÅBä÷êîÉ|ÉCÉìÉ^ÇégópÇ∑ÇÈÇΔǢǧDZÇÃéËñ@ÇÅAìKêÿÇ»ägí£ÉXÉgÉäÉìÉOÇÃÉ`ÉFÉbÉNÇ®ÇÊÇ— OpenGL ÇÃÉoÅ[ÉWÉáÉìÉ`ÉFÉbÉNÇΔëgÇ›çáÇÌÇπÇÍÇŒÅAäJî≠é“ÇÕÅAMac OS X ÇÃëΩólÇ»ÉoÅ[ÉWÉáÉìÇëŒè€Ç…äJî≠ÇçsǧDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅBDZÇÍÇÕÅAÉäÉìÉNéûdžÇÈÇ¢ÇÕé¿çséûÇ…ÉGÉìÉgÉäÉ|ÉCÉìÉgÇ™ÉTÉ|Å[ÉgÇ≥ÇÍǃǢÇÈǩǫǧǩÇñ‚ǢNjÇπÇÒÅBÇ≥ÇÁÇ…ÅAWindows Ç‹ÇΩÇÕ Linux èoêgÇÃëΩÇ≠ÇÃäJî≠é“Ç™égópÇ∑ÇÈÉRÅ[ÉhÇ≈ÇÕÅAwglGetProcAddress ÇÃÇÊǧǻä÷êîÇégópǵǃ OpenGL ÉGÉìÉgÉäÉ|ÉCÉìÉgÇ÷ÇÃä÷êîÉ|ÉCÉìÉ^ÇéÊìæÇ∑ÇÈédçûǛDžǻǡǃǢNjÇ∑ÅBDZÇà QÅïA Ç≈ÇÕÅADZÇÍÇÁÇÃñ‚ëËÇ…ëŒÇ∑ÇÈâåàï˚ñ@ÇíÒãüǵÅAMac OS X Ç≈ä÷êîÉ|ÉCÉìÉ^Çä»íPÇ…égópÇ≈Ç´ÇÈÇÊǧDžǵNjÇ∑ÅBâ∫ãLÇÃÉäÉXÉgÇ…ÅAMach-O ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ®ÇÊÇ— CFM ÉAÉvÉäÉPÅ[ÉVÉáÉìå¸ÇØÇà Cocoa ÉoÅ[ÉWÉáÉìÇ®ÇÊÇ— Carbon ÉoÅ[ÉWÉáÉìÇà GetProcAddress Çé¶ÇµÇ‹Ç∑ÅB
ÉäÉXÉg 1 Ç…ÅANSGLGetProcAddress ÇÃè⁄ç◊Çé¶ÇµÇ‹Ç∑ÅBDZÇÃÉRÅ[ÉhÇ≈ÇÕÇ‹Ç∏ÅAóvãÅÇ≥ÇÍÇΩÉVÉìÉ{ÉãÉlÅ[ÉÄÇïWèÄìIÇ»ñºëOÉ}ÉìÉOÉäÉìÉOÅiñºëOïœä∑ÅjãKë•Ç…è]ǡǃèCê≥ǵÇΩå„ÅAÉVÉìÉ{ÉãÇ™íËã`Ç≥ÇÍǃǢÇÈDZÇΔÇämîFǵǃǢNjÇ∑ÅBǪǵǃç≈å„Ç…ÅAÉVÉìÉ{ÉãÇí≤Ç◊ǃìKêÿÇ»É|ÉCÉìÉ^Çï‘ǵǃǢNjÇ∑ÅBDZÇÃÇÊǧDžǵǃï‘Ç≥ÇÍÇΩÉ|ÉCÉìÉ^ÇégópÇ∑ÇÈëOÇ…ÇÕÅAÉ|ÉCÉìÉ^Ç™óLå¯Ç»ÅiÉ[ÉçÇ≈ÇÕǻǢÅjDZÇΔÇämîFÇ∑ÇÈÇ◊Ç´Ç≈Ç∑ÅBǻǮÅANSSymbol ä÷êîÇÕ system framework ÇÃàÍïîÇ≈džǡǃÅACocoa ÇÃàÍïîÇ≈ÇÕǻǢÇÃÇ≈ÅANSGLGetProcAddress ÇÕ Cocoa ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ…ÇÕÇ‡ÇøÇÎÇÒÇÃDZÇΔÅAMach-O Carbon ÉAÉvÉäÉPÅ[ÉVÉáÉìDžLJégópÇ≈Ç´Ç‹Ç∑ÅB
#import <mach-o/dyld.h>
#import <stdlib.h>
#import <string.h>
void *NSGLGetProcAddress(const char *name)
{
NSSymbol symbol;
char *symbolName;
// UNIX Ç…Ç®ÇØÇÈ C ÇÃÉVÉìÉ{ÉãÉ}ÉìÉOÉäÉìÉOãKë•
// Ç…è]ǡǃÅAÅe_ÅfÇëOÇ…ïtÇØÇ‹Ç∑
symbolName = malloc (strlen (name) + 2);
strcpy(symbolName + 1, name);
symbolName[0] = '_';
symbol = NULL;
if (NSIsSymbolNameDefined (symbolName))
symbol = NSLookupAndBindSymbol (symbolName);
free (symbolName);
return symbol ? NSAddressOfSymbol (symbol) : NULL;
}
|
ÉäÉXÉg 1. NSGLGetProcAddress
|
ÉäÉXÉg 2 Ç…é¶Ç∑ aglGetProcAddress Ç…ÇÕ 3 ǬÇÃä÷êîÇ™ä‹Ç‹ÇÍǃǢNjÇ∑ÅB1 Ǭñ⁄ÇÕ aglInitEntryPoints Ç≈Ç∑ÅBDZÇÍÇÕÅAÉoÉìÉhÉãéQèΔÇÉZÉbÉgÉAÉbÉvǵNjÇ∑ÅB2 Ǭñ⁄ÇÕ aglDellocEntryPoints Ç≈Ç∑ÅBDZÇÍÇÕéQèΔÇÃâï˙Ç…ÇÊÇËÉoÉìÉhÉãÇàÍë|ǵNjÇ∑ÅBǪǵǃ 3 Ǭñ⁄ÇÕÅAé¿ç€Ç…ÉAÉhÉåÉXÇéÊìæÇ∑ÇÈ aglGetProcAddress ä÷êîÇ≈Ç∑ÅBaglInitEntryPoints Çå©ÇÈÇΔÅAèâä˙ÉZÉbÉgÉAÉbÉvÇÃå„Ç…ÅAÅuFrameworksÅvÉtÉHÉãÉ_ÇíTǵèoǵǃ CFURL Ç÷ïœä∑Ç∑ÇÈÇΩÇflÇÃèàóùÇ™ë±Ç´ÅAç≈å„Ç…ÉoÉìÉhÉãÇçÏê¨ÇµÇƒé¿çsÉtÉ@ÉCÉãÇÉçÅ[ÉhǵǃǢÇÈDZÇΔÇ™ÇÌÇ©ÇËÇ‹Ç∑ÅBǢǡÇΩÇÒDZÇÃèàóùÇ™äÆóπÇ∑ÇÍÇŒÅAOpenGL Framework ÇÃä˘ë∂ÇÃîCà”ÇÃÉGÉìÉgÉäÇëŒè€Ç… aglGetProcAddress ÇåƒÇ—èoÇπÇ‹Ç∑ÅBèIóπéûÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕïKÇ∏ aglDellocEntryPoints ÇåƒÇ—èoǵǃÉoÉìÉhÉãÇÃäÑÇËìñǃÇâèúÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBaglDellocEntryPoints ÇÕÅAÉoÉìÉhÉãÇÉAÉìÉçÅ[ÉhǵÅAǪÇÍÇ…ëŒÇ∑ÇÈÉäÉtÉ@ÉåÉìÉXÇâï˙Ç∑ÇÈLJÇÃÇ≈Ç∑ÅBDZÇÃÉRÅ[ÉhÇÕ Carbon ÇëOíÒÇΔǵǃǮÇËÅAMach-O Carbon ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ®ÇÊÇ— CFM Carbon ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ìÆçÏÇ∑ÇÈÇÊǧDžê›åvÇ≥ÇÍǃǢNjÇ∑ÅB
#include <Carbon/Carbon.h>
CFBundleRef gBundleRefOpenGL = NULL;
// -------------------------
OSStatus aglInitEntryPoints (void)
{
OSStatus err = noErr;
const Str255 frameworkName = "\pOpenGL.framework";
FSRefParam fileRefParam;
FSRef fileRef;
CFURLRef bundleURLOpenGL;
memset(&fileRefParam, 0, sizeof(fileRefParam));
memset(&fileRef, 0, sizeof(fileRef));
fileRefParam.ioNamePtr = frameworkName;
fileRefParam.newRef = &fileRef;
// ÅuFrameworksÅvÉfÉBÉåÉNÉgÉäÅ^ÉtÉHÉãÉ_
err = FindFolder (kSystemDomain, kFrameworksFolderType, false,
&fileRefParam.ioVRefNum, &fileRefParam.ioDirID);
if (noErr != err) {
DebugStr ("\pCould not find frameworks folder");
return err;
}
err = PBMakeFSRefSync (&fileRefParam); // ÉtÉHÉãÉ_ÇéwÇ∑ FSRef ÇçÏê¨Ç∑ÇÈ
if (noErr != err) {
DebugStr ("\pCould make FSref to frameworks folder");
return err;
}
// ÉtÉHÉãÉ_ÇéwÇ∑ URL ÇçÏê¨Ç∑ÇÈ
bundleURLOpenGL = CFURLCreateFromFSRef (kCFAllocatorDefault,
&fileRef);
if (!bundleURLOpenGL) {
DebugStr ("\pCould create OpenGL Framework bundle URL");
return paramErr;
}
// GL ÇÃÉoÉìÉhÉãÇéwÇ∑ Ref ÇçÏê¨Ç∑ÇÈ
gBundleRefOpenGL = CFBundleCreate (kCFAllocatorDefault,
bundleURLOpenGL);
if (!gBundleRefOpenGL) {
DebugStr ("\pCould not create OpenGL Framework bundle");
return paramErr;
}
CFRelease (bundleURLOpenGL); // çÏê¨ÇµÇΩÉoÉìÉhÉãÇâï˙Ç∑ÇÈ
// ÉoÉìÉhÉãÇÃÉRÅ[ÉhÇê≥ǵÇ≠ÉçÅ[ÉhÇ≈Ç´ÇΩÇÁÅAÉtÉ@ÉìÉNÉVÉáÉìÇíTÇ∑
if (!CFBundleLoadExecutable (gBundleRefOpenGL)) {
DebugStr ("\pCould not load MachO executable");
return paramErr;
}
return err;
}
// -------------------------
void aglDellocEntryPoints (void)
{
if (gBundleRefOpenGL != NULL) {
// ÉoÉìÉhÉãÇÃÉRÅ[ÉhÇÉAÉìÉçÅ[ÉhǵNjÇ∑
CFBundleUnloadExecutable (gBundleRefOpenGL);
CFRelease (gBundleRefOpenGL);
gBundleRefOpenGL = NULL;
}
}
// -------------------------
void * aglGetProcAddress (char * pszProc)
{
return CFBundleGetFunctionPointerForName (gBundleRefOpenGL,
CFStringCreateWithCStringNoCopy (NULL,
pszProc, CFStringGetSystemEncoding (), NULL));
}
|
ÉäÉXÉg 2. aglGetProcAddress
|
ÉäÉXÉg 3 ÇΔÉäÉXÉg 4 Ç…ÉRÅ[ÉhÇÃî≤êàÇ 2 Ǭé¶ÇµÇ‹Ç∑ÅBDZÇÍÇÁÇÕÅAÇ¢Ç≠ǬǩÇà OpenGL ÉGÉìÉgÉäÉ|ÉCÉìÉgÇëŒè€Ç… aglGetProcAddress ÇΔ NSGLGetProcAddress ÇégópÇ∑ÇÈï˚ñ@Çé¶ÇµÇ‹Ç∑ÅBóºé“ÇÕëÂïœÇÊÇ≠éóǃǢNjÇ∑Ç™ÅAaglGetProcAddress Ç≈ÇÕ aglInitEntryPoints ÇåƒÇ—èoǵǃÅAä÷êîÉ|ÉCÉìÉ^ÇÃéÊìæÇ…êÊóßǡǃÉoÉìÉhÉãÇÉçÅ[ÉhǵÅAaglDellocEntryPoints ÇåƒÇ—èoǵǃÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃèIóπÇ…êÊóßǡǃÉoÉìÉhÉãÇÉAÉìÉçÅ[ÉhǵǃǢNjÇ∑ÅBDZÇÍÇÁà»äOÇÃì_Ç≈ÇÕÅAóºé“ÇÕÇŸÇ⁄ìØÇ∂Ç≈Ç∑ÅB
#import "NSGLGetProcAddress.h" // ÉäÉXÉg 1 Ç…Ç®ÇØÇÈ aglGetProcAddress ÉtÉ@Éì
// ÉNÉVÉáÉìÇéÊìæÇ∑ÇÈÉwÉbÉ_ÉtÉ@ÉCÉã
static void InitEntryPoints (void);
static void DeallocEntryPoints (void);
// ÉtÉ@ÉìÉNÉVÉáÉìÉ|ÉCÉìÉ^Ç typedef Ç≈íËã`Ç∑ÇÈ
typedef void (*glBlendColorProcPtr)(GLclampf red,
GLclampf green,
GLclampf blue,
GLclampf alpha);
typedef void (*glBlendEquationProcPtr)(GLenum mode);
typedef void (*glDrawRangeElementsProcPtr)(GLenum mode,
GLuint start,
GLuint end,
GLsizei count,
GLenum type,
const GLvoid *indices);
// ÉtÉ@ÉìÉNÉVÉáÉìÉ|ÉCÉìÉ^êÈåæ
// íçà”ÅFÉtÉ@ÉìÉNÉVÉáÉìñºÇǪÇÃNjNjégópǵǻǢDZÇΔ
// pfXXX ÇÕÅAÅuÉtÉ@ÉìÉNÉVÉáÉìÇ÷ÇÃÉ|ÉCÉìÉ^ÅvÇ
// Çï\Ç∑è»ó™å`ÇΔǵǃëIÇÒÇæ
glBlendColorProcPtr pfglBlendColor = NULL;
glBlendEquationProcPtr pfglBlendEquation = NULL;
glDrawRangeElementsProcPtr pfglDrawRangeElements = NULL;
// ==========================
static void InitEntryPoints (void)
{
pfglBlendColor = (glBlendColorProcPtr)
NSGLGetProcAddress ("glBlendColor");
pfglBlendEquation = (glBlendEquationProcPtr)
NSGLGetProcAddress ("glBlendEquation");
pfglDrawRangeElements = (glDrawRangeElementsProcPtr)
NSGLGetProcAddress ("glDrawRangeElements");
}
// -------------------------
static void DeallocEntryPoints (void)
{
pfglBlendColor = NULL;
pfglBlendEquation = NULL;
pfglDrawRangeElements = NULL;;
}
|
ÉäÉXÉg 3. NSGLGetProcAddress ÇÃégópó·
|
#include "aglGetProcAddress.h" // ÉäÉXÉg 2 Ç…Ç®ÇØÇÈ aglGetProcAddress Ét
// É@ÉìÉNÉVÉáÉìÇéÊìæÇ∑ÇÈÉwÉbÉ_ÉtÉ@ÉCÉã
static OSStatus InitEntryPoints (void);
static void DeallocEntryPoints (void);
// ÉtÉ@ÉìÉNÉVÉáÉìÉ|ÉCÉìÉ^Ç typedef Ç≈íËã`Ç∑ÇÈ
typedef void (*glBlendColorProcPtr)(GLclampf red,
GLclampf green,
GLclampf blue,
GLclampf alpha);
typedef void (*glBlendEquationProcPtr)(GLenum mode);
typedef void (*glDrawRangeElementsProcPtr)(GLenum mode,
GLuint start,
GLuint end,
GLsizei count,
GLenum type,
const GLvoid *indices);
// ÉtÉ@ÉìÉNÉVÉáÉìÉ|ÉCÉìÉ^êÈåæ
// íçà”ÅFÉtÉ@ÉìÉNÉVÉáÉìñºÇǪÇÃNjNjégópǵǻǢDZÇΔ
// pfXXX ÇÕÅAÅuÉtÉ@ÉìÉNÉVÉáÉìÇ÷ÇÃÉ|ÉCÉìÉ^ÅvÇ
// ï\Ç∑è»ó™å`ÇΔǵǃëIÇÒÇæ
glBlendColorProcPtr pfglBlendColor = NULL;
glBlendEquationProcPtr pfglBlendEquation = NULL;
glDrawRangeElementsProcPtr pfglDrawRangeElements = NULL;
// ==========================
static OSStatus InitEntryPoints (void)
{
OSStatus err = aglInitEntryPoints (); // ÉoÉìÉhÉãÇÃèâä˙âª
if (noErr == err) {
pfglBlendColor = (glBlendColorProcPtr)
aglGetProcAddress ("glBlendColor");
pfglBlendEquation = (glBlendEquationProcPtr)
aglGetProcAddress ("glBlendEquation");
pfglDrawRangeElements = (glDrawRangeElementsProcPtr)
aglGetProcAddress ("glDrawRangeElements");
}
return err;
}
// -------------------------
static void DeallocEntryPoints (void)
{
pfglBlendColor = NULL;
pfglBlendEquation = NULL;
pfglDrawRangeElements = NULL;;
aglDellocEntryPoints (); // ÉoÉìÉhÉãÇÃîjä¸
}
|
ÉäÉXÉg 4. aglGetProcAddress ÇÃégópó·
|
OpenGL ÉGÉìÉgÉäÉ|ÉCÉìÉgÇ÷ÇÃä÷êîÉ|ÉCÉìÉ^ÇÃégópÇ…ä÷ǵǃÅALJǧàÍì_ÅAímǡǃǮÇ≠ÇΔÇÊǢDZÇΔǙdžÇËÇ‹Ç∑ÅBóLå¯Ç»ä÷êîÉ|ÉCÉìÉ^ÇéÊìæÇ≈ǴǃLJÅAǪÇÍÇÕǪÇÃÉGÉìÉgÉäÉ|ÉCÉìÉgÇ™ OpenGL Framework Ç…ÇÊǡǃÉGÉNÉXÉ|Å[ÉgÇ≥ÇÍǃǢÇÈDZÇΔÇà”ñ°Ç∑ÇÈÇæÇØÇ≈ÅAǪÇÃÉãÅ[É`ÉìÇ™ÉTÉ|Å[ÉgÇ≥ÇÍǃǢǃÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃíÜÇ©ÇÁåƒÇ—èoÇπÇÈǩǫǧǩÇé¶Ç∑LJÇÃÇ≈ÇÕdžÇËÇ‹ÇπÇÒÅBOpenGL ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÇÕÅAÅiìÆìIÇ…ÉçÅ[ÉhÇ≥ÇÍÇΩǩǫǧǩDžǩǩÇÌÇÁÇ∏ÅjOpenGL ÉGÉìÉgÉäÉ|ÉCÉìÉgÇåƒÇ—èoÇ∑ëOÇ…ÅAïKÇ∏ÉåÉìÉ_ÉâÇÃåªç›ÇÃägí£ÉXÉgÉäÉìÉOÇ‹ÇΩÇÕ OpenGL ÇÃÉoÅ[ÉWÉáÉìî‘çÜÅAdžÇÈÇ¢ÇÕǪÇÃóºï˚ÇÉ`ÉFÉbÉNǵǃÅAégǮǧÇΔǵǃǢÇÈã@î\Ç™ÉTÉ|Å[ÉgÇ≥ÇÍǃǢÇÈǩǫǧǩÇämîFÇ∑ÇÈÇ◊Ç´Ç≈Ç∑ÅBǬNjÇËÅAÉäÉìÉNéûÇ‹ÇΩÇÕé¿çséûÇÃÉGÉìÉgÉäÉ|ÉCÉìÉgÇÃë∂ç›ÇÕÅAì¡íËÇÃÉåÉìÉ_ÉâDžǮǢǃì¡íËÇÃã@î\Ç™ÉTÉ|Å[ÉgÇ≥ÇÍǃǢÇÈDZÇΔÇé¶Ç∑LJÇÃÇ≈ÇÕdžÇËÇ‹ÇπÇÒÅB
Ç‹ÇΔÇflÇÈÇΔÅAï°êîÉoÅ[ÉWÉáÉìÇà OS ÇëŒè€Ç…äJî≠ÇÇ∑ÇÈèÍçáÅAëŒè€ÇΔÇ»ÇÈÇ∑Ç◊ǃÇà OS ÉoÅ[ÉWÉáÉìÇ…ÉGÉìÉgÉäÉ|ÉCÉìÉgÇ™ë∂ç›Ç∑ÇÈÇΔÇÕå¿ÇÁǻǢÇΩÇflÅAñ¢íËã`ÇÃÉGÉìÉgÉäÉ|ÉCÉìÉgÇ…ÇÊÇÈãNìÆÉGÉâÅ[ÇâÒîÇ∑ÇÈÇΩÇflÇ…ÅACFM ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÇÕÅAOpenGL ÉXÉ^ÉuÉâÉCÉuÉâÉäÇ…ëŒÇ∑ÇÈé„Ç¢ÉäÉìÉNÇóLÇ∑ÇÈÇ©ÅAä÷êîÉ|ÉCÉìÉ^ÇégópÇ∑ÇÈDZÇΔÇ™ñ]NjǵÇ≠ÅAMach-O ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÇÕÅAÉGÉìÉgÉäÉ|ÉCÉìÉgÇ÷ÇÃä÷êîÉ|ÉCÉìÉ^ÇégópÇ∑ÇÈDZÇΔÇ™ñ]NjǵǢÇΔǢǧDZÇΔÇ…Ç»ÇËÇ‹Ç∑ÅB
[2002 îN 11 åé 25 ì˙]
|